/*
 *   Copyright (C) 2010  Jens Kieselbach
 * 
 *   This program is free software: you can redistribute it and/or modify
 *   it under the terms of the GNU General Public License as published by
 *   the Free Software Foundation, either version 3 of the License, or
 *   (at your option) any later version.
 * 
 *   This program is distributed in the hope that it will be useful,
 *   but WITHOUT ANY WARRANTY; without even the implied warranty of
 *   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
 *   GNU General Public License for more details.
 * 
 *   You may obtain a copy of the License at http://www.gnu.org/licenses/gpl.html
 */

package de.kieselbach.grootional.util

import java.sql.*
import java.util.concurrent.*

class DatabaseConnection implements Connection {

    Connection connection
    DatabaseConnectionPool pool

    DatabaseConnection(Connection con, DatabaseConnectionPool p) {

        connection = con
        pool = p
    }

    // ---------------------------------------------------------------------------

    @Override
    public Statement createStatement() throws SQLException {
        connection.createStatement()
    }

    @Override
    public PreparedStatement prepareStatement(String sql) throws SQLException {
        connection.prepareStatement(sql)
    }

    @Override
    public CallableStatement prepareCall(String sql) throws SQLException {
        connection.prepareCall(sql)
    }

    @Override
    public String nativeSQL(String sql) throws SQLException {
        connection.nativeSQL(sql)
    }

    @Override
    public void setAutoCommit(boolean autoCommit) throws SQLException {
        connection.setAutoCommit(autoCommit)
    }

    @Override
    public boolean getAutoCommit() throws SQLException {
        connection.getAutoCommit()
    }

    @Override
    public void commit() throws SQLException {
        connection.commit()
    }

    @Override
    public void rollback() throws SQLException {
        connection.rollback()
    }

    @Override
    public void close() throws SQLException {
        pool.closeConnection(this)
    }

    @Override
    public boolean isClosed() throws SQLException {
        connection.isClosed()
    }

    @Override
    public DatabaseMetaData getMetaData() throws SQLException {
        connection.getMetaData()
    }

    @Override
    public void setReadOnly(boolean readOnly) throws SQLException {
        connection.setReadOnly(readOnly)
    }

    @Override
    public boolean isReadOnly() throws SQLException {
        connection.isReadOnly()
    }

    @Override
    public void setCatalog(String catalog) throws SQLException {
        connection.setCatalog(catalog)
    }

    @Override
    public String getCatalog() throws SQLException {
        connection.getCatalog()
    }

    @Override
    public void setTransactionIsolation(int level) throws SQLException {
        connection.setTransactionIsolation(level)
    }

    @Override
    public int getTransactionIsolation() throws SQLException {
        connection.getTransactionIsolation()
    }

    @Override
    public SQLWarning getWarnings() throws SQLException {
        connection.getWarnings()
    }

    @Override
    public void clearWarnings() throws SQLException {
        connection.clearWarnings()
    }

    @Override
    public Statement createStatement(int resultSetType, int resultSetConcurrency) throws SQLException {
        connection.createStatement(resultSetType, resultSetConcurrency)
    }

    @Override
    public PreparedStatement prepareStatement(String sql, int resultSetType, int resultSetConcurrency) throws SQLException {
        connection.prepareStatement(sql, resultSetType, resultSetConcurrency)
    }

    @Override
    public CallableStatement prepareCall(String sql, int resultSetType, int resultSetConcurrency) throws SQLException {
        connection.prepareCall(sql, resultSetType, resultSetConcurrency)
    }

    @Override
    public Map<String, Class<?>> getTypeMap() throws SQLException {
        connection.getTypeMap()
    }

    @Override
    public void setTypeMap(Map<String, Class<?>> map) throws SQLException {
        connection.setTypeMap(map)
    }

    @Override
    public void setHoldability(int holdability) throws SQLException {
        connection.setHoldability(holdability)
    }

    @Override
    public int getHoldability() throws SQLException {
        connection.getHoldability()
    }

    @Override
    public Savepoint setSavepoint() throws SQLException {
        connection.setSavepoint()
    }

    @Override
    public Savepoint setSavepoint(String name) throws SQLException {
        connection.setSavepoint(name)
    }

    @Override
    public void rollback(Savepoint savepoint) throws SQLException {
        connection.rollback(savepoint)
    }

    @Override
    public void releaseSavepoint(Savepoint savepoint) throws SQLException {
        connection.releaseSavepoint(savepoint)
    }

    @Override
    public Statement createStatement(int resultSetType, int resultSetConcurrency, int resultSetHoldability) throws SQLException {
        connection.createStatement(resultSetType, resultSetConcurrency, resultSetHoldability)
    }

    @Override
    public PreparedStatement prepareStatement(String sql, int resultSetType, int resultSetConcurrency, int resultSetHoldability) throws SQLException {
        connection.prepareStatement(sql, resultSetType, resultSetConcurrency, resultSetHoldability)
    }

    @Override
    public CallableStatement prepareCall(String sql, int resultSetType, int resultSetConcurrency, int resultSetHoldability) throws SQLException {
        connection.prepareCall(sql, resultSetType, resultSetConcurrency, resultSetHoldability)
    }

    @Override
    public PreparedStatement prepareStatement(String sql, int autoGeneratedKeys) throws SQLException {
        connection.prepareStatement(sql, autoGeneratedKeys)
    }

    @Override
    public PreparedStatement prepareStatement(String sql, int[] columnIndexes) throws SQLException {
        connection.prepareStatement(sql, columnIndexes)
    }

    @Override
    public PreparedStatement prepareStatement(String sql, String[] columnNames) throws SQLException {
        connection.prepareStatement(sql, columnNames)
    }

    @Override
    public Clob createClob() throws SQLException {
        connection.createClob()
    }

    @Override
    public Blob createBlob() throws SQLException {
        connection.createBlob()
    }

    @Override
    public NClob createNClob() throws SQLException {
        connection.createNClob()
    }

    @Override
    public SQLXML createSQLXML() throws SQLException {
        connection.createSQLXML()
    }

    @Override
    public boolean isValid(int timeout) throws SQLException {
        connection.isValid(timeout)
    }

    @Override
    public void setClientInfo(String name, String value) throws SQLClientInfoException {
        connection.setClientInfo(name, value)
    }

    @Override
    public void setClientInfo(Properties properties) throws SQLClientInfoException {
        connection.setClientInfo(properties)
    }

    @Override
    public String getClientInfo(String name) throws SQLException {
        connection.getClientInfo(name)
    }

    @Override
    public Properties getClientInfo() throws SQLException {
        connection.getClientInfo()
    }

    @Override
    public Array createArrayOf(String typeName, Object[] elements) throws SQLException {
        connection.createArrayOf(typeName, elements)
    }

    @Override
    public Struct createStruct(String typeName, Object[] attributes) throws SQLException {
        connection.createStruct(typeName, attributes)
    }

    @Override
    void setSchema(String schema) {
        connection.setSchema(schema)
    }

    @Override
    String getSchema() {
        return connection.getSchema()
    }

    @Override
    void abort(Executor executor) {
        connection.abort(executor)
    }

    @Override
    void setNetworkTimeout(Executor executor, int milliseconds) {
        connection.setNetworkTimeout(executor, milliseconds)
    }

    @Override
    int getNetworkTimeout() {
        return connection.getNetworkTimeout()
    }

    @Override
    public <T> T unwrap(Class<T> iface) throws SQLException {
        connection.unwrap(iface)
    }

    @Override
    public boolean isWrapperFor(Class<?> iface) throws SQLException {
        connection.isWrapperFor(iface)
    }
}
